package org.cmcc.xdr.parse;

import java.math.BigInteger;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.cmcc.xdr.entity.HttpVenderEntity;
import com.cmcc.xdr.util.XdrConstant;
import com.cmcc.xdr.util.Util;

public class xdrDataParseUtil {
	/* 防止厂家字段名中出现多个空格或其他字符，以及字段顺序不确定的情况 ，用包含关系进行判断
	 * @param paramList   文件中的字段名
	 * @param fieldList   文件中的数据
	 * @param taskId      任务id
	 * @return
	 * @throws ParseException
	 */
	public static HttpVenderEntity httpEntityMsgByParams(String[] paramList,String[] fieldList,Integer taskId) throws Exception{
		List<String> fieldListNew=new ArrayList<String>();
		if(fieldList.length>0){
			for(String field:fieldList){
//				if(field.contains("E+") && field.contains(".")){ //数值型字段值科学计数法转换
//	    			BigDecimal bigValue=new BigDecimal(field);
//	    			fieldListNew.add(bigValue.toPlainString());
//	    		}else{
	    			fieldListNew.add(field);
//	    		}
			}
		}
   	SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS");
   	HttpVenderEntity httpEntity = new HttpVenderEntity();
   	Pattern pattern = Pattern.compile("^(?i)F+$"); //全F 忽略大小写判断
   	String validate = "(?i)[0-9a-f]+";             //十六进制   忽略大小写判断
   	String allNum= "[0-9]*";                       //判断十六进制时排除全数字的值
   	for(int i=0;i<paramList.length;i++){
   		try{
   		String param=paramList[i].toUpperCase();
   		String value=fieldListNew.get(i).trim();
   		Matcher matcher = pattern.matcher(value);
   		Boolean flag = matcher.find();
   		Boolean isHexNumber=value.matches(validate);
   		Boolean isNumeric=value.matches(allNum);
   		if(XdrConstant.XDR_FIELD_SETEMPT.equals(value)){//将65535这种值变为空
   			value="";
   		}
   		//如果包含单引号进行转义
   		if(value !=null && !("null").equals(value) && value.contains("'")){
   			value=value.replaceAll("'", "\"");
   		}
   		//由于厂家文件中的字段顺序可能与规范文档中不一致，所以判断时先判断不完全匹配的字段 如（app sub type和app type）
			if(param.contains("LOCAL") && param.contains("PROVINCE") && !flag){
   			httpEntity.setLocalProvince(value);
   		}else if(param.contains("LOCAL") && param.contains("CITY") && !flag){
   			httpEntity.setLocalCity(value);
   		}else if(param.contains("OWNER") && param.contains("PROVINCE") && !flag){
   			httpEntity.setOwnerProvince(value);
   		}else if(param.contains("OWNER") && param.contains("CITY") && !flag){
   			httpEntity.setOwnerCity(value);
   		}else if(param.contains("ROAMING") && param.contains("TYPE") && !flag){
   			httpEntity.setRoamingType(value);
   		}else if(param.contains("INTERFACE") && Util.checkNotNull(value) && !flag){
   			if(isHexNumber && !isNumeric){  //十六进制转为十进制
   				httpEntity.setInterFace(Integer.parseInt(Integer.valueOf(value,16).toString()));
   			}else{
   			    httpEntity.setInterFace(Integer.parseInt(value));
   			}
   		}else if(param.contains("REFER") && param.contains("XDR") && Util.checkNotNull(value) && !flag){
	    		httpEntity.setReferXdrId(value);
		    }else if(param.contains("XDR") && param.contains("ID") && !flag){
   			httpEntity.setXdrId(value);
   		}else if(param.contains("APP") && param.contains("TYPE") && param.contains("CODE") && Util.checkNotNull(value) && !flag){
   			httpEntity.setAppTypeCode(Integer.parseInt(value));
   		}else if(param.contains("PROCEDURE") && param.contains("START") && param.contains("TIME") && !flag){
   			long f1=0L;
   			if(value.length() > 13){
   				f1=Long.parseLong(value)/1000;
   			}else{
   				f1=Long.parseLong(value);
   			}
   			httpEntity.setProcedureStartTime(sdf.format(f1));	
   		}else if(param.contains("PROCEDURE") && param.contains("END") && param.contains("TIME") && !flag){
   			long f1=0L;
   			if(value.length() > 13){
   				f1=Long.parseLong(value)/1000;
   			}else{
   				f1=Long.parseLong(value);
   			}
   			httpEntity.setProcedureEndTime(sdf.format(f1));	
   		}else if(param.contains("LONGITUDE") && !flag){
   			httpEntity.setLongitude(value);
   		}else if(param.contains("LATITUDE") && !flag){
   			httpEntity.setLatitude(value);
   		}else if(param.contains("HEIGHT") && Util.checkNotNull(value) && !flag){
	    		httpEntity.setHeight(Integer.parseInt(value));
		    }else if(param.contains("COORDINATE") && param.contains("SYSTEM") && Util.checkNotNull(value) && !flag){
	    		httpEntity.setCoordinateSystem(Integer.parseInt(value));
		    }else if(param.contains("PROTOCOL") && !flag){
		    	httpEntity.setProtocolType(value);
		    }else if(param.contains("APP") && param.contains("SUB") && !flag){
		    	httpEntity.setAppSubType(value);
		    }else if(param.contains("APP") && param.contains("TYPE") && !flag){
			    httpEntity.setAppType(value);
		    }else if(param.contains("APP") && param.contains("CONTENT") && Util.checkNotNull(value) && !flag){
	    		httpEntity.setAppContent(Integer.parseInt(value));
		    }else if(param.contains("APP") && param.contains("STATUS") && Util.checkNotNull(value) && !flag){
	    		httpEntity.setAppStatus(Integer.parseInt(value));
		    }else if(param.contains("ADDRESS") && Util.checkNotNull(value) && !flag){
	    		httpEntity.setIpAddressType(Integer.parseInt(value));
		    }else if(param.contains("USER") && param.contains("IPV4") && !flag){
		    	if(!value.matches("^[0-9\\.]+$")){//ipv4值是ipv6等不规范值抛异常
		    		throw new Exception("USER_IPV4字段值格式不正确："+value);
		    	}else{
		    		httpEntity.setUserIpv4(value);
		    	}
		    }else if(param.contains("USER") && param.contains("IPV6") && !flag){
		    	httpEntity.setUserIpv6(value);
		    }else if(param.contains("USER") && param.contains("PORT") && Util.checkNotNull(value) && !flag){
	    		httpEntity.setUserPort(Integer.parseInt(value));
		    }else if(param.contains("PROTOCAL") && Util.checkNotNull(value) && !flag){
	    		httpEntity.setL4Protocal(Integer.parseInt(value));
		    }else if(param.contains("SERVER") && param.contains("IPV4") && !flag){
		    	if(!value.matches("^[0-9\\.]+$")){//ipv4值是ipv6等不规范值抛异常
		    		throw new Exception("APP_SERVER_IP_IPV4字段值格式不正确："+value);
		    	}else{
		    		httpEntity.setAppServerIpIpv4(value);
		    	}
		    }else if(param.contains("SERVER") && param.contains("IPV6") && !flag){
		    	httpEntity.setAppServerIpIpv6(value);
		    }else if(param.contains("SERVER") && param.contains("PORT") && Util.checkNotNull(value) && !flag){
	    		httpEntity.setAppServerPort(Integer.parseInt(value));
		    }else if(param.contains("UL") && param.contains("DATA") && Util.checkNotNull(value)){
	    		httpEntity.setUlData(Integer.parseInt(value));
		    }else if(param.contains("DL") && param.contains("DATA") && Util.checkNotNull(value)){
	    		httpEntity.setDlData(Integer.parseInt(value));
		    }else if(param.contains("UL") && param.contains("DISORDER") && param.contains("PACKET") && Util.checkNotNull(value)){
	    		httpEntity.setUlDisorderIpPacket(Integer.parseInt(value));
		    }else if(param.contains("DL") && param.contains("DISORDER") && param.contains("PACKET") && Util.checkNotNull(value)){
	    		httpEntity.setDlDisorderIpPacket(Integer.parseInt(value));
		    }else if(param.contains("UL") && param.contains("RETRANS") && param.contains("PACKET") && Util.checkNotNull(value)){
	    		httpEntity.setUlRetransIpPacket(Integer.parseInt(value));
		    }else if(param.contains("DL") && param.contains("RETRANS") && param.contains("PACKET") && Util.checkNotNull(value)){
	    		httpEntity.setDlRetransIpPacket(Integer.parseInt(value));
		    }else if(param.contains("UL") && param.contains("FRAG") && param.contains("PACKETS") && Util.checkNotNull(value)){
	    		httpEntity.setUlIpFragPackets(Integer.parseInt(value));
		    }else if(param.contains("DL") && param.contains("FRAG") && param.contains("PACKETS") && Util.checkNotNull(value)){
	    		httpEntity.setDlIpFragPackets(Integer.parseInt(value));
		    }else if(param.contains("UL") && param.contains("PACKET") && Util.checkNotNull(value)){
	    		httpEntity.setUlIpPacket(Integer.parseInt(value));
		    }else if(param.contains("DL") && param.contains("PACKET") && Util.checkNotNull(value)){
	    		httpEntity.setDlIpPacket(Integer.parseInt(value));
		    }else if(param.contains("UPDURA") && Util.checkNotNull(value) && !flag){
	    		httpEntity.setUpdura(new BigInteger(value));
		    }else if(param.contains("DOWNDURA") && Util.checkNotNull(value) && !flag){
	    		httpEntity.setDowndura(new BigInteger(value));
		    }else if(param.contains("TCP") && param.contains("RESPONSE") && param.contains("TIME") && Util.checkNotNull(value)){
	    		httpEntity.setTcpResponseTime(new BigInteger(value));
		    }else if(param.contains("TCP") && param.contains("ACK") && param.contains("TIME") && Util.checkNotNull(value)){
	    		httpEntity.setTcpAckTime(new BigInteger(value));
		    }else if(param.contains("FIRST") && param.contains("REQ") && param.contains("TIME") && Util.checkNotNull(value)){
	    		httpEntity.setFirstReqTime(new BigInteger(value));
		    }else if(param.contains("WINDOW") && Util.checkNotNull(value)){
	    		httpEntity.setWindow(Integer.parseInt(value));
		    }else if(param.contains("MSS") && Util.checkNotNull(value)){
	    		httpEntity.setMss(Integer.parseInt(value));
		    }else if(param.contains("SESSION") && param.contains("END") && Util.checkNotNull(value) && !flag){
	    		httpEntity.setSessionEnd(Integer.parseInt(value));
		    }else if(param.contains("TCP") && param.contains("SYN") && param.contains("ACK") && Util.checkNotNull(value)){
	    		httpEntity.setTcpSynAckNum(Integer.parseInt(value));
		    }else if(param.contains("TCP") && param.contains("ACK") && param.contains("NUM") && Util.checkNotNull(value)){
	    		httpEntity.setTcpAckNum(Integer.parseInt(value));
		    }else if(param.contains("TCP") && param.contains("SYN") && param.contains("NUM") && Util.checkNotNull(value)){
	    		httpEntity.setTcpSynNum(Integer.parseInt(value));
		    }else if(param.contains("TCP1") && param.contains("HANDSHAKE") && Util.checkNotNull(value) && !flag){
	    		httpEntity.setTcp12HandshakeStatus(Integer.parseInt(value));
		    }else if(param.contains("TCP2") && param.contains("HANDSHAKE") && Util.checkNotNull(value) && !flag){
	    		httpEntity.setTcp23HandshakeStatus(Integer.parseInt(value));
		    }else if(param.contains("TCP") && param.contains("STATUS") && Util.checkNotNull(value) && !flag){
	    		httpEntity.setTcpStatus(Integer.parseInt(value));
		    }else if(param.contains("UL") && param.contains("PROBEID")){
		    	httpEntity.setUlProbeid(value);
		    }else if(param.contains("UL") && param.contains("LINK")){
		    	httpEntity.setUlLinkIndex(value);
		    }else if(param.contains("DL") && param.contains("PROBEID")){
		    	httpEntity.setDlProbeid(value);
		    }else if(param.contains("DL") && param.contains("LINK")){
		    	httpEntity.setDlLinkIndex(value);
		    }else if(param.contains("TRANSACTIONID")){
		    	httpEntity.setTransactionid(value);
		    }else if(param.contains("CONTROL") && Util.checkNotNull(value)){
	    		httpEntity.setFlowControl(Integer.parseInt(value));
		    }else if(param.contains("UL") && param.contains("AVG") && Util.checkNotNull(value)){
	    		httpEntity.setUlAvgRtt(Integer.parseInt(value));
		    }else if(param.contains("DW") && param.contains("AVG") && Util.checkNotNull(value)){
	    		httpEntity.setDwAvgRtt(Integer.parseInt(value));
		    }else if(param.contains("USER") && param.contains("ACCOUNT") && httpEntity.getUserAccount() == null && !flag){  //区分存在两个同名user account的字段
		    	httpEntity.setUserAccount(value);
		    }else if(param.contains("HTTP") && param.contains("VERSION") && !flag){
		    	httpEntity.setHttpVersion(value);
		    }else if(param.contains("MESSAGE") && param.contains("TYPE") && !flag){
		    	httpEntity.setMessageType(value);
		    }else if(param.contains("MESSAGE") && param.contains("STATUS") && !flag){
		    	httpEntity.setMessageStatus(value);
		    }else if(param.contains("FIRST") && param.contains("HTTP") && param.contains("RESPONSE") && param.contains("TIME") && Util.checkNotNull(value)){
	    		httpEntity.setFirstHttpResponseTime(new BigInteger(value));
		    }else if(param.contains("LAST") && param.contains("PACKET") && param.contains("TIME") && Util.checkNotNull(value)){
	    		httpEntity.setLastContentPacketTime(new BigInteger(value));
		    }else if(param.contains("FIRST") && param.contains("RESPONSE") && param.contains("TIME") && Util.checkNotNull(value)){
	    		httpEntity.setFirstResponseTime(new BigInteger(value));
		    }else if(param.contains("LAST") && param.contains("ACK") && param.contains("TIME") && Util.checkNotNull(value)){
	    		httpEntity.setLastAckTime(new BigInteger(value));
		    }else if(param.contains("URI") && param.contains("LENGTH") && Util.checkNotNull(value) && !flag){
	    		httpEntity.setUriLength(Integer.parseInt(value));
		    }else if(param.contains("ONLINE") && param.contains("HOST") && param.contains("LENGTH") && Util.checkNotNull(value) && !flag){
	    		httpEntity.setxOnlineHostLength(Integer.parseInt(value));
		    }else if(param.contains("ONLINE") && param.contains("HOST") && !flag){
		    	//变长字段超过默认的2000则截断
		    	if(value.length() > XdrConstant.XDR_FIELD_LENGTH){
		    	   httpEntity.setxOnlineHost(value.substring(0, XdrConstant.XDR_FIELD_LENGTH));
		    	   httpEntity.setxOnlineHostLength(XdrConstant.XDR_FIELD_LENGTH);
		    	}else{
		    	   httpEntity.setxOnlineHost(value);
		    	}
		    }else if(param.contains("HOST") && param.contains("LENGTH") && Util.checkNotNull(value) && !flag){
		    	if(isHexNumber && !isNumeric){  //十六进制转为十进制
   				httpEntity.setHostLength(Integer.parseInt(Integer.valueOf(value,16).toString()));
		    	}else{
   			    httpEntity.setHostLength(Integer.parseInt(value));
		    	}
		    }else if(param.contains("HOST") && !flag){
		    	//变长字段超过默认的2000则截断
		    	if(value.length() > XdrConstant.XDR_FIELD_LENGTH){
		    	   httpEntity.setHost(value.substring(0, XdrConstant.XDR_FIELD_LENGTH));
		    	   httpEntity.setHostLength(XdrConstant.XDR_FIELD_LENGTH);
		    	}else{
		    	   httpEntity.setHost(value);
		    	}
		    }else if(param.contains("USER") && param.contains("AGENT") && param.contains("LENGTH") && Util.checkNotNull(value) && !flag){
	    		httpEntity.setUserAgentLength(Integer.parseInt(value));
		    }else if(param.contains("USER") && param.contains("AGENT") && !flag){
		    	//变长字段超过默认的2000则截断
		    	if(value.length() > XdrConstant.XDR_FIELD_LENGTH){
		    	   httpEntity.setUserAgent(value.substring(0, XdrConstant.XDR_FIELD_LENGTH));
		    	   httpEntity.setUserAgentLength(XdrConstant.XDR_FIELD_LENGTH);
		    	}else{
		    	   httpEntity.setUserAgent(value);
		    	}
		    }else if(param.contains("HTTP") && param.contains("CONTENT") && param.contains("TYPE") && !flag){
		    	httpEntity.setHttpContentType(value);
		    }else if(param.contains("REFER") && param.contains("URI") && param.contains("LENGTH") && Util.checkNotNull(value) && !flag){
	    		httpEntity.setReferUriLength(Integer.parseInt(value));
		    }else if(param.contains("REFER") && param.contains("URI") && !flag){
		    	//变长字段超过默认的2000则截断
		    	if(value.length() > XdrConstant.XDR_FIELD_LENGTH){
		    	   httpEntity.setReferUri(value.substring(0, XdrConstant.XDR_FIELD_LENGTH));
		    	   httpEntity.setReferUriLength(XdrConstant.XDR_FIELD_LENGTH);
		    	}else{
		    	   httpEntity.setReferUri(value);
		    	}
		    }else if(param.contains("COOKIE") && param.contains("LENGTH") && Util.checkNotNull(value) && !flag){
	    		httpEntity.setCookieLength(Integer.parseInt(value));
		    }else if(param.contains("COOKIE") && !flag){
		    	//变长字段超过默认的2000则截断
		    	if(value.length() > XdrConstant.XDR_FIELD_LENGTH){
		    	   httpEntity.setCookie(value.substring(0, XdrConstant.XDR_FIELD_LENGTH));
		    	   httpEntity.setCookieLength(XdrConstant.XDR_FIELD_LENGTH);
		    	}else{
		    	   httpEntity.setCookie(value);
		    	}
		    }else if(param.contains("CONTENT") && param.contains("LENGTH") && Util.checkNotNull(value)){
	    		httpEntity.setContentLength(new BigInteger(value));
		    }else if(param.contains("KEY") && param.contains("WORD") && !flag){
		    	httpEntity.setKeyWord(value);
		    }else if(param.contains("SERVICE") && param.contains("BEHAVIOR") && Util.checkNotNull(value) && !flag){
	    		httpEntity.setServiceBehaviorFlag(Integer.parseInt(value));
		    }else if(param.contains("SERVICE") && param.contains("COMP") && Util.checkNotNull(value) && !flag){
	    		httpEntity.setServiceCompFlag(Integer.parseInt(value));
		    }else if(param.contains("SERVICE") && param.contains("TIME") && Util.checkNotNull(value) && !flag){
	    		httpEntity.setServiceTime(new BigInteger(value));
		    }else if(param.contains("IE") && Util.checkNotNull(value) && !flag){
	    		httpEntity.setIe(Integer.parseInt(value));
		    }else if(param.contains("PORTAL") && Util.checkNotNull(value)){
	     	   httpEntity.setPortal(Integer.parseInt(value));
	     	}else if(param.contains("LOCATION") && param.contains("LENGTH") && Util.checkNotNull(value) && !flag){
	    		httpEntity.setLocationLength(Integer.parseInt(value));
		    }else if(param.contains("LOCATION") && !flag){
		    	//变长字段超过默认的2000则截断
		    	if(value.length() > XdrConstant.XDR_FIELD_LENGTH){
		    	   httpEntity.setLocation(value.substring(0, XdrConstant.XDR_FIELD_LENGTH));
		    	   httpEntity.setLocationLength(XdrConstant.XDR_FIELD_LENGTH);
		    	}else{
		    	   httpEntity.setLocation(value);
		    	}
		    }else if(param.contains("FIRST") && param.contains("REQUEST") && Util.checkNotNull(value) && !flag){
	    		httpEntity.setFirstRequest(Integer.parseInt(value));
		    }else if(param.contains("USER") && param.contains("ACCOUNT") && !flag){
   			httpEntity.setUserAccountLogin(value);
		    }else if(param.contains("URI") && param.contains("SUB") && param.contains("TYPE") && !flag){
		    	httpEntity.setUriSubType(value);
		    }else if(param.contains("URI") && param.contains("TYPE") && !flag){
		    	httpEntity.setUriType(value);
		    }else if(param.contains("LENGTH") && Util.checkNotNull(value) && !flag){
				httpEntity.setLength(Integer.parseInt(value));
   		}else if(param.contains("URI") && !flag){
		    	//变长字段超过默认的2000则截断
		    	if(value.length() > XdrConstant.XDR_FIELD_LENGTH){
		    	   httpEntity.setUri(value.substring(0, XdrConstant.XDR_FIELD_LENGTH));
		    	   httpEntity.setUriLength(XdrConstant.XDR_FIELD_LENGTH);
		    	}else{
		    	   httpEntity.setUri(value);
		    	}
		    } 
			//移动网信息部分字段
		    else if(param.contains("RAT") && Util.checkNotNull(value) && !flag){
				httpEntity.setRat(Integer.parseInt(value));
   		}else if(param.contains("IMSI") && !flag){
				httpEntity.setImsi(value);
   		}else if(param.contains("IMEI") && !flag){
				httpEntity.setImeiSv(value);
   		}else if(param.contains("MSISDN") && !flag){
				httpEntity.setMsisdn(value);
   		}else if(param.contains("MACHINE") && param.contains("ADD") && param.contains("TYPE") && Util.checkNotNull(value) && !flag){
				httpEntity.setMachineIpAddType(new BigInteger(value));
   		}else if(param.contains("SGW") && param.contains("GGSN") && param.contains("IP") && !flag){
				httpEntity.setSgwGgsnIpAdd(value);
   		}else if(param.contains("ENB") && param.contains("SGSN") && param.contains("IP") && !flag){
				httpEntity.setEnbSgsnIpAdd(value);
   		}else if(param.contains("PGW") && param.contains("ADD") && !flag){
				httpEntity.setPgwAdd(value);
   		}else if(param.contains("SGW") && param.contains("GGSN") && param.contains("PORT") && !flag){
				httpEntity.setSgwGgsnPort(value);
   		}else if(param.contains("ENB") && param.contains("SGSN") && param.contains("PORT") && !flag){
				httpEntity.setEnbSgsnPort(value);
   		}else if(param.contains("PGW") && param.contains("PORT") && !flag){
				httpEntity.setPgwPort(value);
   		}else if(param.contains("ENB") && param.contains("SGSN") && param.contains("GTP") && !flag){
				httpEntity.setEnbSgsnGtpTeid(value);
   		}else if(param.contains("SGW") && param.contains("GGSN") && param.contains("GTP") && !flag){
				httpEntity.setSgwGgsnGtpTeid(value);
   		}else if(param.contains("TAC") && !flag){
				httpEntity.setTac(value);
   		}else if(param.contains("CELL") && !flag){
				httpEntity.setCellId(value);
   		}else if(param.contains("APN") && !flag){
				httpEntity.setApn(value);
   		}
			httpEntity.setTaskId(Long.valueOf(taskId));
	    	}catch(Exception e){
	    		System.out.println(fieldListNew.get(i).trim());
	    		e.printStackTrace();
	    	}
   	}
   	return httpEntity;
   }

}
